
#include "../head.h"
#pragma pack(push, 1) // 按1字节对齐结构体
cai photo[200]; 
typedef struct {
    uint16_t bfType;         // 文件类型，必须是0x4D42
    uint32_t bfSize;         // 文件大小，包括文件头和像素数据
    uint16_t bfReserved1;    // 保留，必须是0
    uint16_t bfReserved2;    // 保留，必须是0
    uint32_t bfOffBits;      // 像素数据的偏移量
} BITMAPFILEHEADER;

typedef struct {
    uint32_t biSize;         // DIB 头大小
    int32_t  biWidth;        // 图像宽度
    int32_t  biHeight;       // 图像高度（正值表示从底部到顶部的像素）
    uint16_t biPlanes;       // 颜色平面数，必须是1
    uint16_t biBitCount;     // 每像素位数（24表示24位色，即RGB888）
    uint32_t biCompression;  // 压缩类型（0表示无压缩）
    uint32_t biSizeImage;    // 图像数据大小
    int32_t  biXPelsPerMeter; // 水平分辨率
    int32_t  biYPelsPerMeter; // 垂直分辨率
    uint32_t biClrUsed;      // 实际使用的颜色数（0表示所有颜色都使用）
    uint32_t biClrImportant; // 重要颜色数（0表示所有颜色都重要）
} BITMAPINFOHEADER;

#pragma pack(pop)
void write_bmp(const char *filename, const char *rgb888, int width, int height)
{
    FILE *file = fopen(filename, "wb");
    if (!file) {
        perror("fopen error");
        exit(1);
    }

    BITMAPFILEHEADER fileHeader;
    BITMAPINFOHEADER infoHeader;

    int row_padded = (width * 3 + 3) & (~3);
    int imageSize = row_padded * height;

    fileHeader.bfType = 0x4D42;
    fileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + imageSize;
    fileHeader.bfReserved1 = 0;
    fileHeader.bfReserved2 = 0;
    fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

    infoHeader.biSize = sizeof(BITMAPINFOHEADER);
    infoHeader.biWidth = width;
    infoHeader.biHeight = height;
    infoHeader.biPlanes = 1;
    infoHeader.biBitCount = 24;
    infoHeader.biCompression = 0;
    infoHeader.biSizeImage = imageSize;
    infoHeader.biXPelsPerMeter = 0;
    infoHeader.biYPelsPerMeter = 0;
    infoHeader.biClrUsed = 0;
    infoHeader.biClrImportant = 0;

    fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, file);
    fwrite(&infoHeader, sizeof(BITMAPINFOHEADER), 1, file);

    // Write pixel data with padding
    for (int i = 0; i < height; ++i) {
        fwrite(rgb888 + (width * 3 * (height - i - 1)), 3, width, file);
        uint8_t padding[3] = {0};
        fwrite(padding, (4 - (width * 3) % 4) % 4, 1, file);
    }

    fclose(file);
}
int is_bmp_file(const char *filename)
{
    size_t len = strlen(filename);
    return len >= 4 && strcmp(filename + len - 4, ".bmp") == 0;
}
int numsofAlbum()
{
    int nums = 0;
    DIR *dir;
    struct dirent *entry;
    struct stat file_stat;
    char filepath[256];  // 用于保存完整的文件路径

    // 打开目录
    dir = opendir("img");
    if (dir == NULL)
    {
        perror("opendir");
        exit(EXIT_FAILURE);
    }

    // 遍历目录
    while ((entry = readdir(dir)) != NULL)
    {
        // 拼接目录名和文件名，生成完整的文件路径
        snprintf(filepath, sizeof(filepath), "img/%s", entry->d_name);

        // 使用完整路径调用 stat
        if (stat(filepath, &file_stat) == -1)
        {
            perror("stat");
            continue;  // 如果 stat 失败，跳过当前文件
        }

        // 判断是否为文件且文件名以.bmp结尾
        if (S_ISREG(file_stat.st_mode) && is_bmp_file(entry->d_name))
        {
            cai p;
            p.filename = entry->d_name;
            //strcpy(photo[nums++], p);
            photo[nums++] = p;  // 统计有多少张图片 同时放进相册
        }
    }

    closedir(dir);
    return nums;
}
